/**
 * Software License, Version 1.0
 * 
 * Copyright 2003 The Trustees of Indiana University.  All rights reserved.
 * 
 *
 *Redistribution and use in source and binary forms, with or without 
 *modification, are permitted provided that the following conditions are met:
 *
 *1) All redistributions of source code must retain the above copyright notice,
 * the list of authors in the original source code, this list of conditions and
 * the disclaimer listed in this license;
 *2) All redistributions in binary form must reproduce the above copyright 
 * notice, this list of conditions and the disclaimer listed in this license in
 * the documentation and/or other materials provided with the distribution;
 *3) Any documentation included with all redistributions must include the 
 * following acknowledgement:
 *
 *"This product includes software developed by the Community Grids Lab. For 
 * further information contact the Community Grids Lab at 
 * http://communitygrids.iu.edu/."
 *
 * Alternatively, this acknowledgement may appear in the software itself, and 
 * wherever such third-party acknowledgments normally appear.
 * 
 *4) The name Indiana University or Community Grids Lab or NaradaBrokering, 
 * shall not be used to endorse or promote products derived from this software 
 * without prior written permission from Indiana University.  For written 
 * permission, please contact the Advanced Research and Technology Institute 
 * ("ARTI") at 351 West 10th Street, Indianapolis, Indiana 46202.
 *5) Products derived from this software may not be called NaradaBrokering, 
 * nor may Indiana University or Community Grids Lab or NaradaBrokering appear
 * in their name, without prior written permission of ARTI.
 * 
 *
 * Indiana University provides no reassurances that the source code provided 
 * does not infringe the patent or any other intellectual property rights of 
 * any other entity.  Indiana University disclaims any liability to any 
 * recipient for claims brought by any other entity based on infringement of 
 * intellectual property rights or otherwise.  
 *
 *LICENSEE UNDERSTANDS THAT SOFTWARE IS PROVIDED "AS IS" FOR WHICH NO 
 *WARRANTIES AS TO CAPABILITIES OR ACCURACY ARE MADE. INDIANA UNIVERSITY GIVES
 *NO WARRANTIES AND MAKES NO REPRESENTATION THAT SOFTWARE IS FREE OF 
 *INFRINGEMENT OF THIRD PARTY PATENT, COPYRIGHT, OR OTHER PROPRIETARY RIGHTS. 
 *INDIANA UNIVERSITY MAKES NO WARRANTIES THAT SOFTWARE IS FREE FROM "BUGS", 
 *"VIRUSES", "TROJAN HORSES", "TRAP DOORS", "WORMS", OR OTHER HARMFUL CODE.  
 *LICENSEE ASSUMES THE ENTIRE RISK AS TO THE PERFORMANCE OF SOFTWARE AND/OR 
 *ASSOCIATED MATERIALS, AND TO THE PERFORMANCE AND VALIDITY OF INFORMATION 
 *GENERATED USING SOFTWARE.
 */
package cgl.narada.wsinfra.deployment.impl;

import java.util.Enumeration;
import java.util.Hashtable;

import cgl.narada.wsinfra.deployment.FilterPipeline;
import cgl.narada.wsinfra.deployment.RoleManager;
import cgl.narada.wsinfra.exception.DeploymentException;

/** The RoleManager is responsible for mantaining information related to
    the processing of certain roles. This includes maintaining the 
    filter-pipeline associated with a certain role, the ability to modify 
    this pipeline dynamically and to de-register support for certain roles.

    @author Shrideep Pallickara
    $Date: 2005/07/29 22:44:01 $
    $Revison$
*/


public class RoleManagerImpl extends RoleManager {

  private static final RoleManager instance = new RoleManagerImpl();
  private Hashtable rolesAndPipelines;
  private String moduleName = "RoleManagerImpl: ";

  private RoleManagerImpl() {
    rolesAndPipelines = new Hashtable();
  }

  public static RoleManager getInstance() {
    return instance;
  }

  /** Register a filter pipeline to be associated with a specific role. This
      method throws an exception if this role has been previously
      registered. */
  public void 
  registerFilterPipelineForRole(FilterPipeline filterPipeline, 
				String role)
    throws DeploymentException {
    String errorReport = null;

    checkIfRoleIsNull(role);

    if (filterPipeline == null) {
      errorReport = moduleName + "The specified FilterPipeline is NULL.";
      throw new DeploymentException(errorReport);
    }

    if (rolesAndPipelines.containsKey(role)) {
      errorReport = moduleName + "The specified role [" + role + 
	"] has been previously registered."; 
      throw new DeploymentException(errorReport);		
    }
    
    rolesAndPipelines.put(role, filterPipeline);
  }


  /** De-register a specific role. This method throws an exception if this
      role NOT been previously registered OR if the pipeline indentifier
      DOES NOT match the one associated with this role. */
  public void deregisterRole(String role, String filterPipelineId) 
    throws DeploymentException {
    
    String errorReport = null;

    checkIfRoleIsNull(role);
    if (filterPipelineId == null) {
      errorReport = moduleName + "The specified Filter PipelineID is NULL!";
      throw new DeploymentException(errorReport);
    }

    if (!rolesAndPipelines.containsKey(role)) {
      errorReport = moduleName + "The specified role [" + role + 
	"] has NOT been previously registered."; 
      throw new DeploymentException(errorReport);		
    }
    
    
    FilterPipeline filterPipeline= (FilterPipeline)rolesAndPipelines.get(role);
    
    if (filterPipeline.getIdentifier() != filterPipelineId) {
      errorReport = moduleName + "The specified Filter PipelineID DOES NOT" +
	" match the one contained within the registered filter pipeline. " +
	"De-registeration is not successful.";

      throw new DeploymentException(errorReport);
    }

  }

  
  /** Indicates if there is support for a specific role. */
  public boolean hasSupportForRole(String role) throws DeploymentException {
    checkIfRoleIsNull(role);
    if (rolesAndPipelines.containsKey(role)) {
      return true;
    } else {
      return false;
    }
    
  }


  /** Gets a list of the supported roles. */
  public Enumeration getSupportedRoles() {
    return rolesAndPipelines.keys();
  } 


  /** Retrieve the filter pipeline associated with a specific role. This
      method throws an exception if the role is an unknown one.*/
  protected FilterPipeline getFilterPipelineForRole(String role)
    throws DeploymentException {
    String errorReport = null;

    checkIfRoleIsNull(role);

    if (!rolesAndPipelines.containsKey(role)) {
      errorReport = moduleName + "The specified role [" + role + 
	"] has NOT been previously registered."; 
      throw new DeploymentException(errorReport);		
    }

    FilterPipeline filterPipeline= (FilterPipeline)rolesAndPipelines.get(role);
    return filterPipeline;
  }
  

  /** Checks to see if the role is NULL. */
  private void checkIfRoleIsNull(String role) throws DeploymentException {
    if (role == null) {
      throw new DeploymentException(moduleName + 
				    "The specified role is NULL!");
    }    
  }


  
}

